package cn.bonoon.kernel.support.services;

import cn.bonoon.kernel.events.OperateEvent;
import cn.bonoon.kernel.support.IOperator;
import cn.bonoon.kernel.support.entities.Persistable;

/**
 * <pre>
 * 可编辑的逻辑对象接口的定义
 * 
 * V3.0：
 * 
 * </pre>
 * @author jackson
 * @version V3.0
 * 
 * @param <E>
 */
public interface GenericService<E extends Persistable> extends SearchService<E>, OperateService {
	/**
	 * <pre>
	 * 保存实体，实体的值必须由外部赋值
	 * 该方法需要检测用户的操作权限，以及如果是树结构、文件结构或其它结构，需要对父节点和本节点的一些固有信息进行处理
	 * </pre>
	 */
	E save(OperateEvent event, E entity) throws Exception;
	E save(IOperator operator, E entity) throws Exception;

	/** 更新实体 */
	E update(OperateEvent event, E entity) throws Exception;
	E update(IOperator operator, E entity) throws Exception;
	
	/** 把普通的实体转为数据库实体，实现自动转值 */
	E save(OperateEvent event) throws Exception;
	/** 把普通的实体转为数据库实体，实现自动转值 */
	E update(OperateEvent event, Long id) throws Exception;

	/** 删除指定实体 */
	void delete(OperateEvent event, E entity) throws Exception;
	void delete(IOperator operator, E entity) throws Exception;
	
	boolean isStatusable();
	boolean isMovable();
}
